package zeno.project.springboot.util;

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 日期时间工具
 * @author zhiyong
 */
public class DateTimeUtil {
    public static final String YYYY_MM_DD = "yyyy-MM-dd";
    public static final String YYYY_MM = "yyyy_MM";
    public static final String HH_MM_SS = "hh:mm:ss";
    /**
     * 12小时制
     */
    public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd hh:mm:ss";
    /**
     * 24小时制
     */
    public static final String YYYY_MM_DD_24HH_MM_SS = "yyyy-MM-dd HH:mm:ss";

    public static final SimpleDateFormat TIME_FORMAT = new SimpleDateFormat(YYYY_MM_DD_24HH_MM_SS);

    public static void main(String[] args) {
        //初始化Timestamp，需要注意构造方法的入参是一个时间戳
        Timestamp timestamp = new Timestamp(System.currentTimeMillis());
        //获取Timestamp对象对应的时间戳
        System.out.println(TIME_FORMAT.format(timestamp.getTime()));
        String format1 = TIME_FORMAT.format(System.currentTimeMillis());
        System.out.println(format1);
    }
    /**
     * 获取当前时间的毫秒级时间戳，即UTC时间戳
     * 毫秒级时间戳
     */
    public static Long currentUtcTimestamp(){
        return System.currentTimeMillis();
    }

    /**
     * 获取当前时间的秒级(Unix)时间戳
     * 秒级时间戳
     */
    public static Long currentUnixTimestamp() {
        String currentTime = Long.toString(currentUtcTimestamp()).substring(0, 10);
        return Long.parseLong(currentTime);
    }
    /**
     * 通过时区偏移量获取当前的格林威治（0时区）的时间戳
     * @param time 目标时间戳
     * @return GM时间戳
     */
    public static Long getUtcTimestamp(Long time){
        Calendar calendar = getUtcCalendar(time);
        return calendar.getTimeInMillis();
    }

    /**
     * 转换为格林威治的日期对象
     * @param time 目标时间戳
     * @return GM日期对象
     */
    public static Date getUtcDate(Long time){
        Calendar calendar = getUtcCalendar(time);
        return calendar.getTime();
    }

    /**
     * 得到格林威治日历对象
     * @param time 目标时间戳
     * @return GM日历对象
     */
    public static Calendar getUtcCalendar(Long time) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(time);
        // 偏移量
        int zoneOffset = calendar.get(Calendar.ZONE_OFFSET);
        // 夏令时差
        int dstOffset = calendar.get(Calendar.DST_OFFSET);
        // 扣除变量,减去指定的时间量，单位毫秒
        calendar.add(Calendar.MILLISECOND, (zoneOffset + dstOffset));
        return calendar;
    }
    /**
     * 获取指定时间戳所在月份开始的时间戳(单位:毫秒)
     * @param dateTimeMillis 指定时间戳(单位:毫秒)
     * @return Long
     */
    public static Long getMonthBeginMills(Long dateTimeMillis) {
        Calendar c = Calendar.getInstance();
        c.setTime(new Date(dateTimeMillis));
        //设置为1号,当前日期既为本月第一天
        c.set(Calendar.DAY_OF_MONTH, 1);
        //将小时设置为0
        c.set(Calendar.HOUR_OF_DAY, 0);
        //将分钟设置为0
        c.set(Calendar.MINUTE, 0);
        //将秒设置为0
        c.set(Calendar.SECOND,0);
        //将毫秒设置为0
        c.set(Calendar.MILLISECOND, 0);
        // 获取本月第一天的时间戳
        return c.getTimeInMillis() ;
    }
}
